# -*- coding: UTF-8 -*-
from django.core import template, template_loader

# SYNTAXE --
# 'nom_du_modèle': ('contenu du modèle', 'contexte sous forme de dictionnaire', 'chaîne attendue en sortie' ou exception)
TEMPLATE_TESTS = {
    # Modèle standard sans héritage
    'test01': ("1{% block un %}_{% endblock %}3{% block deux %}_{% endblock %}", {}, '1_3_'),

    # Héritage standard sur deux niveaux
    'test02': ("{% extends 'test01' %}{% block un %}2{% endblock %}{% block deux %}4{% endblock %}", {}, '1234'),

    # Trois niveaux d'héritage, sans redéfinition au troisième niveau
    'test03': ("{% extends 'test02' %}", {}, '1234'),

    # Deux niveaux d'héritage, sans redéfinition au deuxième niveau
    'test04': ("{% extends 'test01' %}", {}, '1_3_'),

    # Deux niveaux d'héritage avec guillemets doubles au lieu de guillemets simples
    'test05': ('{% extends "test02" %}', {}, '1234'),

    # Trois niveaux d'héritage avec modèle-parent spécifié au moyen d'une variable
    'test06': ("{% extends toto %}", {'toto': 'test02'}, '1234'),

    # Deux niveaux d'héritage, avec un bloc défini et un bloc non-défini
    'test07': ("{% extends 'test01' %}{% block deux %}5{% endblock %}", {}, '1_35'),

    # Trois niveaux d'héritage avec un bloc défini au troisième niveau, deux blocs définis au niveau précédent
    'test08': ("{% extends 'test02' %}{% block deux %}5{% endblock %}", {}, '1235'),

    # Trois niveaux d'héritage avec deuxième et troisième niveau sans redéfinition
    'test09': ("{% extends 'test04' %}", {}, '1_3_'),

    # Trois niveaux d'héritage avec espaces EN DEHORS d'un bloc (ils doivent normalement être ignorés)
    'test10': ("{% extends 'test04' %}      ", {}, '1_3_'),

    # Trois niveaux d'héritage avec les deux blocs définis au troisième niveau mais aucun au deuxième niveau
    'test11': ("{% extends 'test04' %}{% block un %}2{% endblock %}{% block deux %}4{% endblock %}", {}, '1234'),

    # Trois niveaux d'héritage avec un bloc défini au troisième niveau et l'autre bloc défini au deuxième niveau
    'test12': ("{% extends 'test07' %}{% block un %}2{% endblock %}", {}, '1235'),

    # Trois niveaux d'héritage avec un troisième niveau surchargeant le deuxième niveau
    'test13': ("{% extends 'test02' %}{% block un %}a{% endblock %}{% block deux %}b{% endblock %}", {}, '1a3b'),

    # Un bloc qui n'est défini que dans un modèle-fils ne doit normalement pas être affiché
    'test14': ("{% extends 'test01' %}{% block nouveaubloc %}RIEN NE S'AFFICHE{% endblock %}", {}, '1_3_'),

    # Un bloc à l'intérieur d'un autre bloc
    'test15': ("{% extends 'test01' %}{% block un %}2{% block interieur %}interieur{% endblock %}{% endblock %}", {}, '12interieur3_'),

    # Un bloc à l'intérieur d'un autre bloc (niveau 2)
    'test16': ("{% extends 'test15' %}{% block interieur %}dehors{% endblock %}", {}, '12dehors3_'),

    # balise {% load %} (modèle-parent qui sert de base à test-exception04)
    'test17': ("{% load sondage.sondages %}{% block un %}1234{% endblock %}", {}, '1234'),

    # balise {% load %} (usage standard, sans héritage)
    'test18': ("{% load sondage.sondages %}{% voteratio reponse sondage 400 %}5678", {}, '05678'),

    # balise {% load %} (à l'intérieur d'un modèle-fils)
    'test19': ("{% extends 'test01' %}{% block un %}{% load sondage.sondages %}{% voteratio reponse sondage 400 %}5678{% endblock %}", {}, '1056783_'),

    # Doit déclencher une exception pour nom de modèle invalide
    'test-exception01': ("{% extends 'n-existe-pas' %}", {}, template.TemplateSyntaxError),

    # Doit déclencher une exception pour nom de modèle invalide (spécifié via une variable)
    'test-exception02': ("{% extends n_existe_pas %}", {}, template.TemplateSyntaxError),

    # Doit déclencher une exception pour une balise {% extends %} en trop
    'test-exception03': ("{% extends 'test01' %}{% block un %}2{% endblock %}{% extends 'test16' %}", {}, template.TemplateSyntaxError),

    # Doit déclencher une exception pour l'emploi d'une balise personnalisée dans un modèle-fils, avec balise {% load %} présente dans le modèle-parent mais pas dans le modèle-fils
    'test-exception04': ("{% extends 'test17' %}{% block un %}{% votegraph reponse sondage 400 %}5678{% endblock %}", {}, template.TemplateSyntaxError),
}

# La fonction suivante remplace la fonction template_loader standard.
def test_template_loader(template_name):
    try:
        return TEMPLATE_TESTS[template_name][0]
    except KeyError:
        raise template.TemplateDoesNotExist, template_name
template_loader.load_template_source = test_template_loader

def run_tests():
    tests = TEMPLATE_TESTS.items()
    tests.sort()
    for name, vals in tests:
        try:
            output = template_loader.get_template(name).render(template.Context(vals[1]))
        except Exception, e:
            if e.__class__ == vals[2]:
                print "%s -- OK" % name
            else:
                print "%s -- ÉCHEC. Une exception %s s'est déclenchée : %s" % (name, e.__class__, e)
            continue
        if output == vals[2]:
            print "%s -- OK" % name
        else:
            print "%s -- ÉCHEC. La valeur attendue était %r, on a obtenu %r" % (name, vals[2], output)

if __name__ == "__main__":
    run_tests()
